#include <iostream>
using std::cout;
using std::endl;
//非类型参数
template <class T = int,int kBase = 10>
T multiply(T x, T y){
	return x * y * kBase;
}

void test(){
    int i1 = 3,i2 = 4;
//此时想要进行隐式实例化就不允许了，因为kBase无法推导
cout << multiply(i1,i2) << endl;  //error
//显示实例化
//T=int kBase=10
cout << multiply<int,10>(i1,i2) << endl;   //ok
}

void test2(){
    //此时是由一个推断的类型
    //T=int默认值，最终并没有返回一个int，说明没有使用这个默认值
    //类型参数：主动指定的数据类型 > 编译器推断出来的数据类型 > 默认类型
    //非类型参数：主动赋的值  > 默认值
    cout << multiply(1.2, 1.2) << endl;
}

//根本没办法推断出T1究竟是什么类型
template <class T1 = double,class T2 = double,int kBase = 10>
T1 multiply2(T2 t1, T2 t2){
	return t1 * t2 * kBase;
}

void test3(){
    cout << multiply2(1.2,1.2) << endl;         //error
    cout << multiply2<double>(1.2,1.2) << endl; //ok
}

int main()
{
    test2();
    return 0;
}

